import * as THREE from 'three';
import { Plane, Wall } from '.';

/**
 * 房间
 */
export class Room extends THREE.Group {
  /**
   * 初始化房间
   * 以墙厚度中心测量大小，不是墙厚的外边或内边
   * @param {Object} options 房间参数
   *
   * @param {Number} options.width 长
   * @param {Number} options.height 高
   * @param {Number} options.depth 深
   * @param {Number} options.thickness 墙厚度
   * @param {Number} options.x 位置横向
   * @param {Number} options.y 位置上下
   * @param {Number} options.z 位置纵向
   */
  constructor(options) {
    super();
    /**
     * 默认值
     * 大小有宽度，高度，深度，
     * 厚度
     * 位置有宽度，高度，深度
     */
    const defaultOptions = {
      width: 1000,
      height: 200,
      depth: 1000,
      thickness: 20,
      x: 0,
      y: 0,
      z: 0
    };
    // 合并默认值和传入的值
    this.options = Object.assign(defaultOptions, options);
    // 添加地板和墙
    this.add(this.plane(), ...this.wall());
    const { x, y, z } = this.options;
    // 设置房间位置
    this.position.set(x, y, z);
  }

  /**
   * 地板
   * 使用宽度和深度构建
   * @returns 返回平面
   */
  plane() {
    const { width, depth } = this.options;
    return new Plane({ width, depth });
  }

  //
  /**
   * 四面墙
   * 前、后、左、后墙构建
   * @returns 返回墙几何体数组
   */
  wall() {
    return [this.before(), this.after(), this.left(), this.right()];
  }

  /**
   * 前墙
   * 宽度填充墙厚度
   * @returns 返回墙几何体
   */
  before() {
    const { width: w, height: h, depth: d, thickness: t } = this.options;
    const width = w + t;
    const height = h;
    const depth = t;
    const x = 0;
    const y = h / 2;
    const z = d / 2;
    return new Wall({ width, height, depth, x, y, z });
  }
  /**
   * 后墙
   * @returns 返回墙几何体
   */
  after() {
    const { width: w, height: h, depth: d, thickness: t } = this.options;
    const width = w + t;
    const height = h;
    const depth = t;
    const x = 0;
    const y = h / 2;
    const z = -d / 2;
    return new Wall({ width, height, depth, x, y, z });
  }

  /**
   * 左墙
   * @returns 返回墙几何体
   */
  left() {
    const { width: w, height: h, depth: d, thickness: t } = this.options;
    const width = t;
    const height = h;
    const depth = d + t;
    const x = -w / 2;
    const y = h / 2;
    const z = 0;
    return new Wall({ width, height, depth, x, y, z });
  }

  /**
   * 右墙
   * @returns 返回墙几何体
   */
  right() {
    const { width: w, height: h, depth: d, thickness: t } = this.options;
    const width = t;
    const height = h;
    const depth = d + t;
    const x = w / 2;
    const y = h / 2;
    const z = 0;
    return new Wall({ width, height, depth, x, y, z });
  }
}
